/*
 * Flashlib - QB9 common Flash library
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

 
package com.qb9.flashlib.audio
{
	import flash.events.Event;

	/**
	 * Plays a list of Audio object sequentially 
	 * 
	 * @see Audio
	 * @see IPlayable
	 */ 

	public class Playlist extends PlayableCollection
	{
		/**
		 * Receives a list of IPlayables and plays them all.
		 * The SOUND_COMPLETE event is triggered after it
		 * loops over all the elements, the required amount of times.
		 */
		
		public function Playlist(tracks:Array, id:String = null, shuffle:Boolean = false)
		{
			super(tracks, id);
			
			if (shuffle)
				this.shuffle();
		}
		
		protected override function _onPlayComplete(e:Event) : void
		{
			this.next();
			
			if (!loops) // last
				super._onPlayComplete(e);
		}
		
		/* Properties */
		
		/**
		 * Loops the WHOLE collection as many times (endless by default)
		 */
		public override function loop(times:int = int.MAX_VALUE) : void
		{
			super.loop(times);
			active.play();
		}
		
		/**
		 * The overall length of the list of assets
		 */
		public override function get length() : Number
		{
			var l:Number = 0;
			for each(var track:IPlayable in tracks)
				l += track.length;
			return l;
		}
		
		
		/**
		 * Starts playing the next asset
		 */
		public function next() : void
		{
			active.stop();

			activeIndex++;
			
			if (activeIndex >= tracks.length)
			{
				loops--;
				activeIndex = 0;
			}
			
			if (loops > 0)
			{
				active.volume = lastVolume;
				active.play();
			}
		}
	}
}
